home *** CD-ROM | disk | FTP | other *** search
/ Language/OS - Multiplatform Resource Library / LANGUAGE OS.iso / et / et3_0-a1.lha / et3 / src / Class.C < prev    next >
C/C++ Source or Header  |  1992-06-09  |  4KB  |  200 lines

  1. #ifdef __GNUG__
  2. #pragma implementation
  3. #endif
  4.  
  5. #include "Class.h"
  6.  
  7. #include "Error.h"
  8. #include "Storage.h"
  9. #include "String.h"
  10. #include "ObjArray.h"
  11. #include "OrdColl.h"
  12. #include "ObjectTable.h"
  13. #include "ClassManager.h"
  14. #include "AccessMem.h"
  15.  
  16. //---- Class -------------------------------------------------------------------
  17.  
  18. NewMetaImpl(Class,Object, (TP(version), TP(super), TP(className), T(size),
  19.     TP(proto), TS(declFileName), T(declFileLine), TS(implFileName),
  20.     T(implFileLine), TP(subclasses), T(instanceCount), TP(methods)));
  21.  
  22. Class *Class::classptr;
  23.  
  24. #ifdef ET_
  25.     static char *EtPrefix= _QUOTE_(ET_);
  26. #else
  27.     static char *EtPrefix= "";
  28. #endif
  29.  
  30. Class::Class(char *name, int sz, Object *pro, char *implfn, char *declfn,
  31.                         int il, int dl, bool abstract)
  32. {
  33.     size= sz;
  34.     className= name;
  35.     if (strncmp(name, EtPrefix, sizeof(EtPrefix)-1) == 0) 
  36.     className= &name[sizeof(EtPrefix)-1];
  37.     declFileName= declfn;
  38.     implFileName= implfn;
  39.     declFileLine= dl;
  40.     implFileLine= il;
  41.     proto= pro;
  42.     subclasses= 0;
  43.     instanceCount= 0;
  44.     methods= 0;
  45.     version= "2.2";
  46.     if (abstract)
  47.     SetFlag(eClassAbstract);
  48.     if (gClassManager == 0)
  49.     gClassManager= new ClassManager;
  50.     gClassManager->Add(this);
  51.     if (proto)
  52.     SetFlag(eClassObject);
  53.     classptr= 0;
  54. }
  55.  
  56. Class::Class(char *name, char *vers)
  57. {
  58.     className= name;
  59.     version= vers;
  60.     proto= 0;
  61.     methods= 0;
  62.     subclasses= 0;
  63. }
  64.  
  65. Class::~Class()
  66. {
  67.     if (proto) {
  68.     delete (void*) proto;        // avoid call of destructor for prototype
  69.     proto= 0;
  70.     }
  71.     if (methods) {
  72.     methods->FreeAll();
  73.     SafeDelete(methods);
  74.     }
  75.     SafeDelete(subclasses);
  76.     if (gClassManager)
  77.     gClassManager->Remove(this);
  78. }
  79.  
  80. //---- class hierarchy ---------------------------------------------------------
  81.  
  82. Class *Class::SetSuper()
  83. {
  84.     super= classptr;
  85.     classptr= this;
  86.     return this;
  87. }
  88.  
  89. bool Class::isKindOf(register Class *c)
  90. {
  91.     register Class *cc;
  92.  
  93.     for (cc= this; cc; cc= cc->super)
  94.     if (cc == c)
  95.         return TRUE;
  96.     return FALSE;
  97. }
  98.  
  99. void Class::AddSubclass(Class *cl)
  100. {
  101.     if (subclasses == 0)
  102.     subclasses= new OrdCollection;
  103.     subclasses->Add(cl);
  104. }
  105.  
  106. Iterator *Class::SubclassIterator()
  107. {
  108.     if (subclasses == 0)
  109.     subclasses= new OrdCollection;
  110.     return subclasses->MakeIterator();
  111. }
  112.  
  113. //---- comparing ---------------------------------------------------------------
  114.  
  115. u_long Class::Hash()
  116. {
  117.     register u_long hash;
  118.     register char *p= className;
  119.  
  120.     for (hash= 0; *p; p++)
  121.     hash= (hash << 1) ^ *p;
  122.     return hash;
  123. }
  124.  
  125. bool Class::IsEqual(Object *op)
  126.     //return strcmp(className, ((Class*)op)->className) == 0
  127.     //            && strcmp(version, ((Class*)op)->version) == 0;
  128.     return strcmp(className, ((Class*)op)->className) == 0;
  129. }
  130.  
  131. int Class::Compare(Object *op)
  132. {
  133.     //int rc= strcmp(className, ((Class*)op)->className);
  134.     //if (rc)
  135.     //    return rc;
  136.     //return strcmp(version, ((Class*)op)->version);
  137.     return strcmp(className, ((Class*)op)->className);
  138. }
  139.  
  140. //---- converting, input/output ------------------------------------------------
  141.  
  142. char* Class::AsString()
  143. {
  144.     return className;
  145. }
  146.  
  147. void Class::Show(char *buf, void *addr, int, bool isptr)
  148. {
  149.     if (isptr) {
  150.     if (ObjectTable::PtrIsValid((Object*)addr))
  151.         sprintf(buf, "<%s>", ((Object*)addr)->ClassName());
  152.     } else
  153.     sprintf(buf, "<inline>");
  154. }
  155.  
  156. OStream &Class::PrintOn(OStream &os)
  157. {
  158.     return os << className SP << version SP;
  159. }
  160.  
  161. // always called on prototype object !!!
  162. Object *Class::ReadAndMap(IStream &is)
  163. {
  164.     char name[40], vers[40];
  165.     
  166.     is >> name >> vers;
  167.     return gClassManager->FindOrLoad(name, vers);
  168. }
  169.  
  170. //---- members -----------------------------------------------------------------
  171.  
  172. Object *Class::SomeMember()
  173. {
  174.     return ObjectTable::SomeMember(this);
  175. }
  176.  
  177. void Class::EnumerateMyMembers(AccessMembers *ac)
  178. {
  179.     if (className && ac)
  180.     ac->ClassName(className);
  181.     if (proto)
  182.     proto->Members(ac);
  183. }
  184.  
  185. void Class::EnumerateMembers(AccessMembers *ac)
  186. {
  187.     EnumerateMyMembers(ac);
  188.     if (super)
  189.     super->EnumerateMembers(ac);
  190. }
  191.  
  192. //---- instance statistics -----------------------------------------------------
  193.  
  194. Object *Class::SomeInstance()
  195. {
  196.     return ObjectTable::SomeInstance(this);
  197. }
  198.  
  199.